// 使用字面量进行赋值
// 注意：这种方法设置后，值就不可更改了
let a: 10;
console.log('a', a)

// 字面量拓展，可更改值
// 方法一：
// 注意：此方法仅能在初始定义的值之间更改
let b: 'male' | 'female'
b = 'male'
b = 'female'

// 方法二：nice
let c: boolean | string
c = true
c = 'hello'

// -------------------------

// 定义任意变量
// 注意：设置后相当于对该变量关闭了语法检查，不建议用
let d: any
d = 10
d = 'hello'
d = true

// 定义未知类型
let e: unknown
e = 10
e = 'hello'
e = true

let s: string
// 注意，当 any 类型变量向其他变量赋值时不报错，unknown抱错
s = d
// s = e
// 解决方案
// 方案一：
if(typeof e === 'string') {
    s = e
}
// 方案二：
// 类型断言：可以用来告诉解析器变量的实际类型
s = e as string
s = <string>e

// ------------------------------

// void - 空，在函数中表示没有返回值
function name1(): void{
    console.log('void')
}

// never 表示永远不会有返回值
function name2(): never {
    throw new Error('报错')
}